Flask + WSGI + Nginx部署服务器

前言

前几天因为课程作业需要,使用基于python的Flask框架实现了一个简单的网页,好吧代码太丑就不贴了。那么问题来了,如何实现Flask框架下web程序的部署?

正文

很早就入手了一台腾讯云的服务器,一直空着没怎么用,这下终于派上用场了。而且学生价优惠只要1元哟。装载镜像Ubuntu Server 14.04.1 LTS 32位。个人采用的服务器登陆软件为putty,文件传输软件为FlashFXP。

我采用的部署方案是:

  • Web 服务器采用 uwsgi host Flask
  • 用 Supervisor 引用 uwsgi 作常规启动服务
  • 基于 Nginx 作反向代理

步骤

通过 putty 远程登录服务器

1
2
login as: 登陆名
ubuntu@XXX.XXX.XXX.XXX's password:密码

安装 python 环境

接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python 的 pip 安装工具即可。pip 用于安装一些基于python 应用的软件工具,在下文中将会频繁。一定要安装python-dev!!,都别问我在这上面坑了多久。

使用指令:
ubuntu@ubuntu:~$ sudo apt-get install python-pip,python-dev

使用 virtualenv

  1. virtualenv 用来建立一个虚拟的python环境,一个专属于项目的python环境。用virtualenv 来保持一个干净的环境非常有用。
  2. pip 用来解决项目依赖问题。将项目所有依赖的第三方库写在一个requirements.txt 中用pip 批量安装。一般和virtualenv 配合使用,将所有包安装在virtualenv 的环境中。

Virtualenv 能够做到:

  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用

安装:
ubuntu@ubuntu:~$ sudo pip install virtualenv

安装后我们可以通过以下指令在当前目录下新建一个名为venv的虚拟环境:
ubuntu@ubuntu:~/flask$ virtualenv venv

然后进入虚拟环境:
ubuntu@ubuntu:~/flask$ source venv/bin/activate
(venv)ubuntu@ubuntu:~/flask$

然后只要看到指令最前端出现(venv) 就说明我们已经进入虚拟环境啦,可以用deactivate退出虚拟环境。

安装 Flask

可以使用清单一次安装requirements.txt,我这里只列出常用的包,个人根据需要自己装:

Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-WTF==0.10.2

然后使用命令一次安装:
(venv)ubuntu@ubuntu:~/flask$ pip install -r requirements.txt

项目结构

│── flask
│ └── venv //虚拟目录
│ └── app //Flask 程序目录
│ ├── manage.py
│ ├── requirements.txt
│ ├── config.ini

安装 uWSGI

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

因为装过了pip工具,接下来就简单多了:
(venv)ubuntu@ubuntu:~/flask$ pip install uwsgi

配置 uwsgi

好了重要部分来了,config.ini 是这样写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001
//指向网站目录
chdir = /home/www/
//python 启动程序文件
wsgi-file = manage.py
//python 程序内用以启动的 application 变量名
callable = app
//处理器数
processes = 4
//线程数
threads = 2
//状态检测地址
stats = 127.0.0.1:9191

写好了以后可以这样执行:
(venv)ubuntu@ubuntu:~/flask$ uwsgi config.ini

运行 uwsgi

1
2
3
4
[uWSGI] getting INI configuration from config.ini
Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014]
// 此处略去那些无用的启动信息
Stats server enabled on 127.0.0.1:9191 fd: 15

OK, 此时已经正常启动 uwsgi 并将 Flask 项目载入其中了,ctrl+c 关闭程序。但这只是命令启动形式,要使其随同服务器启动并作为后台服务运行才是运营环境的实际所需要。因此接下来我们需要安装另一个工具来引导 uwsgi 。此时可以退出虚拟环境了。

安装 Supervisor

Supervisor可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。
ubuntu@ubuntu:~$ sudo apt-get install supervisor

Supervisor 的全局的配置文件位置在:
/etc/supervisor/supervisor.conf

正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的 *.conf 文件放在
/etc/supervisor/conf.d/

下就可以,那么我们就新建立一个用于启动 flask 项目的 uwsgi 的 supervisor 配置 (命名为:my_flask_supervisor.conf):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//启动命令入口
command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini
//命令程序所在目录
directory=/home/www/my_flask
//运行命令的用户名
user=root
autostart=true
autorestart=true
//日志地址
stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log

启动服务
ubuntu@ubuntu:~$ sudo service supervisor start

终止服务
ubuntu@ubuntu:~$ sudo service supervisor stop

安装 Nginx

Nginx是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件
安装Nginx
sudo apt-get install nginx

配置 Nginx

Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将
/etc/nginx/sites-available/default
文件替换掉就可以了

新建一个 default 文件:

server {  
      listen  80;  
      server_name XXX.XXX.XXX; #公网地址  

      location / {  
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
        uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虚拟环境目录
        uwsgi_param UWSGI_CHDIR  /home/www/my_flask; # 指向网站根目录
        uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
      }
    }

更改配置还需要记得重启一下nginx:
ubuntu@ubuntu:~$ sudo service nginx restart

最后一步,启动uwsgi就大功告成啦
(venv)my_flask root$ uwsgi config.ini

后记

  1. 一步一步来,遇到问题就google

  2. 再次重申记得装python-dev!!